package com.ihrm.company.dao;
import com.ihrm.domain.company.Company;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;

/**
 * @知识概览
 *
 * // @Component：
 * 通用注解：@Component 是一个通用注解，用于标记一个类为 Spring 管理的组件。
 * 它可以用于任何类型的类，只要这个类需要被 Spring 容器管理。
 * 功能：被标记为 @Component 的类会被 Spring 自动扫描并注册为一个 Bean，
 * 从而可以利用 Spring 的依赖注入（DI）功能。
 * 示例：工具类、配置类、自定义工具类等。
 *
 * // @Repository：
 * 特化注解：@Repository 是 @Component 的特化版本，专门用于标记数据访问层（Data Access Layer, DAO）的组件，
 * 简单来说就是@Repository 继承 @Component ,并此基础上增强一些功能。
 * 功能：与 @Component 类似，@Repository 也会被 Spring 自动扫描并注册为一个 Bean。
 * 但它更明确地表示这个类与数据访问相关（如数据库操作）。
 * 异常处理：@Repository 提供了异常翻译功能，会将底层数据访问框架（如 JDBC、Hibernate）
 * 的异常翻译为 Spring 的 DataAccessException，从而提供统一的异常处理机制。
 *
 * //@Repository：
 * 用途：用于标记数据访问层（Data Access Layer, DAO）的组件，
 * 数据访问层组件通常会注入到业务逻辑层（@Service）中，由业务逻辑层调用其方法。
 * 功能：主要用于与数据库交互，执行 CRUD 操作（增、删、改、查）或其他数据库操作。
 * 示例：JpaRepository、JpaSpecificationExecutor 等接口通常被标记为 @Repository。
 *
 * // @Repository：
 * Spring 为 @Repository 提供了异常翻译功能。当数据访问层抛出异常时（如 JDBC 异常或 Hibernate 异常）
 * ，Spring 会将其翻译为 Spring 的 DataAccessException，从而提供统一的异常处理机制。
 * 这使得开发者可以使用 Spring 的异常体系，而不是直接处理底层框架（如 Hibernate 或 JDBC）的异常。
 *
 * // @Service：
 * 没有内置的异常翻译功能，主要用于业务逻辑处理。如果需要处理异常，通常需要手动捕获和处理。
 */

@Repository
// JpaRepository <Company, String> 这里的 Company 就是实体类，String 是主键的类型
/**
 * 通过继承 JpaRepository<Company, String>，你可以直接使用 JpaRepository 提供的所有方法
 * JpaSpecificationExecutor<T> 是 Spring Data JPA 提供的一个接口，
 * 用于支持基于 JPA Criteria API 的动态查询功能。它通常与 JpaRepository 一起使用，以实现更复杂的查询逻辑。
 * Specification 是一个接口，用于定义查询条件。它基于 JPA Criteria API，允许开发者以编程的方式构建动态查询条件。
 * Specification 的核心方法是 toPredicate，它返回一个 Predicate，用于定义查询的条件
 */
public interface CompanyDao extends JpaRepository<Company, String>, JpaSpecificationExecutor<Company> {





}

